package main

import (
	"strings"
	"unicode/utf8"

	"github.com/ngaut/log"
	"fmt"
)

func tString() {
	str := "/aa.bb/c"
	strSplit := strings.Split(str, "/")
	if len(strSplit) != 3 {
		log.Errorf("not correct method")
		return
	}
	log.Infof("service: %v, method: %v", strSplit[1], strSplit[2])

	// https://stackoverflow.com/questions/33139020/can-golang-multiply-strings-like-python-can
	log.Infof("len: %v, utf8.RuneCount: %v", len("ā"), utf8.RuneCountInString("ā")) // 2, 1

	log.Infof("strings repeat: %v", strings.Repeat("#ab", utf8.RuneCountInString((str))))

	r := strings.NewReplacer("TPL_OPLOG_SIZE", "20", "TPL_RS_NAME", "abc")
	log.Infof(r.Replace("This is <TPL_RS_NAME> HTML </b>!"))

	s1 := "hello"
	d1 := []byte(s1)
	d2 := d1[2:]
	d3 := d1[:4]
	log.Infof("d1: %v", d1)

	s2 := string(d2[:])
	s3 := string(d3[:])
	log.Infof("s2:%v, s3: %s", s2, s3)

	// 在slice中，len(sli)表示可见元素有几个（也即直接打印元素看到的元素个数），而cap(sli)表示所有元素有几个
	arr := []int{2, 3, 5, 7, 11, 13}
	sli := arr[1:4]
	fmt.Println(sli)
	fmt.Println(len(sli))
	fmt.Println(cap(sli)) // 5，因为底层结构有 5个，对sli 可见的有3个
	fmt.Println(sli[:cap(sli)])

	var a = []int{1,2,3,4,5}
	b := a      //此时a，b都指向了内存中的[1 2 3 4 5]的地址
	b[1] = 10   //相当于修改同一个内存地址，所以a的值也会改变
	c := make([]int,5,5)    //切片的初始化
	copy(c,a)   //将切片acopy到c
	c[1] = 20   //copy是值类型，所以a不会改变
	fmt.Printf("a的值是%v，a的内存地址是%p\n",a,&a)   //a的值是[1 10 3 4 5]，a的内存地址是0xc42000a180
	fmt.Printf("b的值是%v，b的内存地址是%p\n",b,&b)   //b的值是[1 10 3 4 5]，b的内存地址是0xc42000a1a0
	fmt.Printf("c的值是%v，c的内存地址是%p\n",c,&c)   //c的值是[1 20 3 4 5]，c的内存地址是0xc42000a1c0
	d := &a     //将a的内存地址赋值给d，取值用*d
	a[1] = 11
	fmt.Printf("d的值是%v，d的内存地址是%p\n",*d,d)   //d的值是[1 11 3 4 5]，d的内存地址是0xc420084060
	fmt.Printf("a的值是%v，a的内存地址是%p\n",a,&a)   //a的值是[1 11 3 4 5]，a的内存地址是0xc420084060


	// strings method
	s1 = "mongo_wt4.0-v170"
	fmt.Printf("trim: %s\n", strings.TrimPrefix(s1, "mongo_wt4.0"))
}
